/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pkg1ifxClienteTcp;
import pkg1ifxArchivos.cifxConfig;
import pkg1ifxArchivos.cifxLogs;
import pkg1ifxArchivos.caDatosTemplate;

/**
 *
 * Coleccion de Applicacions Bots
 * @author strailaparicio
 */
public class caAppsBots {
    
    private caAppBot[] oAPPBOTS = new caAppBot[0]; 
    private cifxLogs olog = new cifxLogs();
    private cifxConfig oconfbots =null;
    
    public caAppsBots(cifxLogs odato)
    {
        try
        {
            String[] sparam;
            String[] datbot;
            caAppBot bottmp;
            olog=odato;
            olog.outMensaje("caAppsBots.caAppsBots(): Cargando conf AppsBots adirectorbots.conf");
            oconfbots = new cifxConfig("adirectorbots.conf", olog);
            sparam=oconfbots.getParametros();
            for(int i=0;i <sparam.length;i++)
            {
                datbot=getDatAppBot(sparam[i]);
                bottmp=new caAppBot(olog);
                bottmp.setNombre(datbot[0]);
                bottmp.setPuerto(Integer.valueOf(datbot[1]));
                bottmp.setPathTrabajo(datbot[2]);
                bottmp.setTimeOut(Integer.valueOf(datbot[3]));
                olog.outMensaje("caAppsBots.caAppsBots(): Registrando AppBots en aDIRECTOR: \n NOMBRE: "+bottmp.getNombre()
                        + "\n PUERTO: "+bottmp.getPuerto()
                        + "\n TIMEOUT RESPUESTAS: "+bottmp.getTimeout()
                        );
                agregaAppBot(bottmp);
                
            }
            
            olog.outMensaje("caAppsBots.caAppsBots(): conf AppsBots adirectorbots.conf OK");
            
        }catch(Exception err)
        {
            olog.outMensaje("caAppsBots.caAppsBots(): ERROR " + err.getMessage());
            
        }
        
    }
    private String[] getDatAppBot(String sdatos)
    {
        //SERVIDOR=PUERTO,DIRDESTINO
        String stmp=sdatos;
        String[] ssalida;// = new String[3];
        stmp=sdatos.replace("=", ",");
        ssalida=stmp.split(",");
        //stmp=stmp.substring(stmp.indexOf("=")+1);
        //ssalida[0]=sdatos.substring(0,sdatos.indexOf("="));
        //ssalida[1]=stmp.split(",")[0];
        //ssalida[2]=stmp.split(",")[1];
        
        return ssalida;
    }
    private void agregaAppBot(caAppBot dato)
    {
        caAppBot[] stmps = new caAppBot[oAPPBOTS.length];
        System.arraycopy(oAPPBOTS, 0, stmps, 0, oAPPBOTS.length);
        oAPPBOTS=new caAppBot[oAPPBOTS.length+1];
        System.arraycopy(stmps, 0, oAPPBOTS, 0, stmps.length);
        
        if((oAPPBOTS.length-1)<0)
        {
            oAPPBOTS[0]=dato;
        }
        else
        {
            oAPPBOTS[oAPPBOTS.length-1]=dato;
        }
        
    }
    public caAppBot[] getBots()
    {
        return oAPPBOTS;
    }

    /**
     *
     * @param template
     * @return
     */
    public String[] ejecutaINSERTAR(caDatosTemplate template)
    {
        String[] respuestas= new String[oAPPBOTS.length];
        try{
            //Disparando Threads
            olog.outMensaje("caAppsBots.ejecutaINSERTAR(): INICIANDO THREADS "+oAPPBOTS.length);
            /*for(int i=0; i<oAPPBOTS.length;i++)
            {
                caThreadAppBot appbotTHREAD = new caThreadAppBot(oAPPBOTS[i], "INSERTAR", olog);
                appbotTHREAD.start();
            }*/
            //Como es instertar solo envio la petidion al ultimo bots
            oAPPBOTS[oAPPBOTS.length-1].setTemplate(template);
            caThreadAppBot appbotTHREAD = new caThreadAppBot(oAPPBOTS[oAPPBOTS.length-1], "INSERTAR", olog);
            appbotTHREAD.start();
            //Esperando respuesta de los Bots
            olog.outMensaje("caAppsBots.ejecutaINSERTAR(): ESPERANDO RESPUESTAS DE LOS BOTS: "+oAPPBOTS.length);
            int nrespuestas=0;
            while(true)
            {
                for(int i=0; i<oAPPBOTS.length;i++)
                {
                    if(oAPPBOTS[i].getRespuestaSolApBot()!=-9)
                    {
                        respuestas[i]=oAPPBOTS[i].getResultadoAppBot();
                        nrespuestas++;
                        olog.outMensaje("caAppsBots.ejecutaINSERTAR(): BOT: "+oAPPBOTS[i].getNombre());
                        olog.outMensaje("caAppsBots.ejecutaINSERTAR(): RESPONDE: "+oAPPBOTS[i].getRespuestaSolApBot());

                    }
                }
                if(nrespuestas==oAPPBOTS.length)
                    break;
            }
            olog.outMensaje("caAppsBots.ejecutaINSERTAR(): RESPUESTAS ENTREGADAS POR LOS BOTS: "+nrespuestas);

        }catch(Exception err)
        {
            olog.outMensaje("caAppsBots.ejecutaINSERTAR(): ERROR "+err.getMessage());
        }

        return respuestas;
    }
    /***
     * Esta funcion ejecuta una verificaicion de un template en los diferentes AppBots
     * registrados, la funcion ejecuta los Threads necesarios para enviar la peticion a los
     * AppBots y espera las respuestas, al final arma la cadena con los resultados.
     * @param template
     * @return 
     */
    public String[] ejecutaVERIFICACION(caDatosTemplate template)
    {
        String[] respuestas= new String[oAPPBOTS.length];
        try{
            //Disparando Threads
            olog.outMensaje("caAppsBots.ejecutaVERIFICACION(): INICIANDO THREADS "+oAPPBOTS.length);
            for(int i=0; i<oAPPBOTS.length;i++)
            {
                oAPPBOTS[i].setTemplate(template);
                caThreadAppBot appbotTHREAD = new caThreadAppBot(oAPPBOTS[i], "VERIFICAR", olog);
                appbotTHREAD.start();
            }
            
            //Esperando respuesta de los Bots
            olog.outMensaje("caAppsBots.ejecutaVERIFICACION(): ESPERANDO RESPUESTAS DE LOS BOTS: "+oAPPBOTS.length);
            int nrespuestas=0;
            while(true)
            {
                for(int i=0; i<oAPPBOTS.length;i++)
                {
                    if(oAPPBOTS[i].getRespuestaSolApBot()!=-9)
                    {
                        respuestas[i]=oAPPBOTS[i].getResultadoAppBot();
                        nrespuestas++;
                        olog.outMensaje("caAppsBots.ejecutaVERIFICACION(): BOT: "+oAPPBOTS[i].getNombre());
                        olog.outMensaje("caAppsBots.ejecutaVERIFICACION(): RESPONDE: "+oAPPBOTS[i].getRespuestaSolApBot());
                        
                    }
                }
                if(nrespuestas==oAPPBOTS.length)
                    break;
            }
            olog.outMensaje("caAppsBots.ejecutaVERIFICACION(): RESPUESTAS ENTREGADAS POR LOS BOTS: "+nrespuestas);
            
        }catch(Exception err)
        {
            olog.outMensaje("caAppsBots.ejecutaVERIFICACION(): ERROR "+err.getMessage());
        }
        
        return respuestas;
    }
    
    /***
     * 
     * 
     * @param template
     * @return 
     */    
    public String[] ejecutaIDENTIFICACION(caDatosTemplate template)
    {
        String[] respuestas= new String[oAPPBOTS.length];
        try{
            //Disparando Threads
            olog.outMensaje("caAppsBots.ejecutaIDENTIFICACION(): INICIANDO THREADS "+oAPPBOTS.length);
            for(int i=0; i<oAPPBOTS.length;i++)
            {
                oAPPBOTS[i].setTemplate(template);
                caThreadAppBot appbotTHREAD = new caThreadAppBot(oAPPBOTS[i], "IDENTIFICAR", olog);
                appbotTHREAD.start();
            }
            
            //Esperando respuesta de los Bots
            olog.outMensaje("caAppsBots.ejecutaIDENTIFICACION(): ESPERANDO RESPUESTAS DE LOS BOTS: "+oAPPBOTS.length);
            int nrespuestas=0;
            while(true)
            {
                for(int i=0; i<oAPPBOTS.length;i++)
                {
                    if(oAPPBOTS[i].getRespuestaSolApBot()!=-9)
                    {
                        if(respuestas[i]==null)
                        {
                            respuestas[i]=oAPPBOTS[i].getResultadoAppBot();
                            nrespuestas++;
                            olog.outMensaje("caAppsBots.ejecutaIDENTIFICACION(): BOT: "+oAPPBOTS[i].getNombre());
                            olog.outMensaje("caAppsBots.ejecutaIDENTIFICACION(): RESPONDE: "+oAPPBOTS[i].getRespuestaSolApBot());
                        }
                    }
                }
                if(nrespuestas>=oAPPBOTS.length)
                    break;
            }
            olog.outMensaje("caAppsBots.ejecutaIDENTIFICACION(): RESPUESTAS ENTREGADAS POR LOS BOTS: "+nrespuestas);
            
        }catch(Exception err)
        {
            olog.outMensaje("caAppsBots.ejecutaIDENTIFICACION(): ERROR "+err.getMessage());
        }
        
        return respuestas;
    }
}
